{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "hrIjW1WdwZBK" }, "source": [ "# Medidas estadísticas\n", "\n", "Nuevamente cargamos el dataset de ifood para hacer una exploración de los datos. Para este caso, vamos a hacer una exploración de los datos desde las medidas de tendencia central y dispersión. Así mismo, vamos a hacer una exploración de los datos categóricos que aquí se encuentran escritos como variables dummy.\n", "\n", "## Carga de datos\n", "\n", "Recordemos que para cargar los datos debe hacer clic en el panel izquierdo en el botón de exploración de archivos. En ese menu tendra la opción de subir algunos datos. \n", "\n", "```{note}\n", "Recuerde que para cargar los datos debe hacer clic en el panel izquierdo en el botón de exploración de archivos. En ese menu tendra la opción de subir algunos datos. En Google Colab, el archivo se borrará una vez que se cierre el entorno.\n", "```\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 273 }, "id": "uPV77Vux0beE", "outputId": "0f08fa26-fb96-462c-f934-3b62a3d804c4" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IncomeKidhomeTeenhomeRecencyMntWinesMntFruitsMntMeatProductsMntFishProductsMntSweetProductsMntGoldProds...marital_Togethermarital_Widoweducation_2n Cycleeducation_Basiceducation_Graduationeducation_Mastereducation_PhDMntTotalMntRegularProdsAcceptedCmpOverall
058138.00058635885461728888...0000100152914410
146344.011381116216...000010021150
271613.00026426491271112142...10001007346920
326646.01026114201035...100010048430
458293.0109417343118462715...00000014073920
\n", "

5 rows × 39 columns

\n", "
" ], "text/plain": [ " Income Kidhome Teenhome Recency MntWines MntFruits MntMeatProducts \\\n", "0 58138.0 0 0 58 635 88 546 \n", "1 46344.0 1 1 38 11 1 6 \n", "2 71613.0 0 0 26 426 49 127 \n", "3 26646.0 1 0 26 11 4 20 \n", "4 58293.0 1 0 94 173 43 118 \n", "\n", " MntFishProducts MntSweetProducts MntGoldProds ... marital_Together \\\n", "0 172 88 88 ... 0 \n", "1 2 1 6 ... 0 \n", "2 111 21 42 ... 1 \n", "3 10 3 5 ... 1 \n", "4 46 27 15 ... 0 \n", "\n", " marital_Widow education_2n Cycle education_Basic education_Graduation \\\n", "0 0 0 0 1 \n", "1 0 0 0 1 \n", "2 0 0 0 1 \n", "3 0 0 0 1 \n", "4 0 0 0 0 \n", "\n", " education_Master education_PhD MntTotal MntRegularProds \\\n", "0 0 0 1529 1441 \n", "1 0 0 21 15 \n", "2 0 0 734 692 \n", "3 0 0 48 43 \n", "4 0 1 407 392 \n", "\n", " AcceptedCmpOverall \n", "0 0 \n", "1 0 \n", "2 0 \n", "3 0 \n", "4 0 \n", "\n", "[5 rows x 39 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "# Load the dataset from the user's Google Drive\n", "df = pd.read_csv(\"ifood_df.csv\")\n", "\n", "# Show DataFrame\n", "df.head(5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Medidas estadísticas para la variable `Recency`\n", "\n", "La variable `Recency` es una variable numérica que representa la cantidad de días desde la última compra. Esta resulta ser una variable muy importante para el análisis de la base de datos, ya que nos permite entender el comportamiento de los clientes. Vamos a hacer varios tipos de exploraciones de esta variable y haremos algunas cuentas que son de variables categóricas pero que aquí tendrán un interpretación.\n", "\n", "Por ejemplo, sabemos que las tablas de frecuencia son una forma de entender la distribución de los datos. En este caso, vamos a hacer una tabla de frecuencia para la variable `Recency` y vamos a hacer una tabla de frecuencia para la variable `Recency` pero con intervalos de clase. \n", "\n", "```{note}\n", "Recuerde que para hacer una tabla de frecuencia con intervalos de clase, primero debe definir el número de intervalos que va a tener. En este caso, vamos a definir 5 intervalos de clase.\n", "```\n", "\n", "```{note}\n", "Decimos que las tablas de frecuencia son una forma de entender la distribución de los datos. Efectivamente se utiliza más y mejor en variablñes categóricas, pero en variables numéricas también se puede hacer.\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 461 }, "id": "HJQrma1Q2b01", "outputId": "b30fe287-f5d0-47b6-b539-1043f47aa89e" }, "outputs": [ { "data": { "text/plain": [ "Recency\n", "56 37\n", "30 32\n", "54 32\n", "46 31\n", "65 30\n", " ..\n", "41 15\n", "59 14\n", "22 13\n", "7 12\n", "44 11\n", "Name: count, Length: 100, dtype: int64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Veamos la frecuencia de las categorías\n", "df['Recency'].value_counts()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Recency\n", "(-0.099, 19.8] 451\n", "(19.8, 39.6] 441\n", "(39.6, 59.4] 445\n", "(59.4, 79.2] 434\n", "(79.2, 99.0] 434\n", "Name: count, dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "### Ahora una tabla con rangos de clases\n", "\n", "# Crear una tabla de frecuencias\n", "tabla_frecuencia = pd.cut(df['Recency'], bins=5).value_counts().sort_index()\n", "\n", "# Mostrar la tabla de frecuencias\n", "tabla_frecuencia\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{note}\n", "`pd.cut` es una función de pandas que nos permite hacer intervalos de clase. En este caso, el argumento `bins` nos permite definir el número de intervalos de clase.\n", "```\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora hagamos cálculos más simples como el máximo, el mínimo, la media, la mediana y la desviación estándar, entre otros.\n", "\n", "```{note}\n", "Recuerde que la media y la mediana son medidas de tendencia central y la desviación estándar es una medida de dispersión.\n", "\n", "Las medidas de tendencia central nos permiten entender el valor central de los datos, mientras que las medidas de dispersión nos permiten entender la variabilidad de los datos.\n", "```\n", "\n", "```{note}\n", "Esta información es importantisima en la inferencia tratar con estos conceptos es fundamental puesto que nos permite aplicar técnicas como:\n", "\n", "- Segmentación de clientes\n", "- Análisis de canasta de productos\n", "- Análisis de comportamiento de compra\n", "- Análisis de ciclo de vida del cliente\n", "- Análisis de retención de clientes\n", "\n", "Incluso, los famosos test A/B que se utilizan para entender el impacto de una campaña de marketing.\n", "```\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "99\n" ] } ], "source": [ "## Veamos el mínimo y máximo de la variable Recency\n", "print(df['Recency'].min())\n", "print(df['Recency'].max())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "El mínimo de la variable Recency es: 0\n", "El máximo de la variable Recency es: 99\n" ] } ], "source": [ "## Si quisiera describir de mejor manera el dato que estoy observando escribiría\n", "\n", "print('El mínimo de la variable Recency es: ', df['Recency'].min())\n", "print('El máximo de la variable Recency es: ', df['Recency'].max())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "La media de la variable Recency es: 49.00907029478458\n", "La mediana de la variable Recency es: 49.0\n", "La moda de la variable Recency es: 0 56\n", "Name: Recency, dtype: int64\n" ] } ], "source": [ "## Veamos las medidas de tendencia central de la variable Recency\n", "\n", "print('La media de la variable Recency es: ', df['Recency'].mean())\n", "print('La mediana de la variable Recency es: ', df['Recency'].median())\n", "print('La moda de la variable Recency es: ', df['Recency'].mode())\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "El rango de la variable Recency es: 99\n", "La varianza de la variable Recency es: 837.0670683276326\n", "La desviación estándar de la variable Recency es: 28.932111370026774\n" ] } ], "source": [ "## Veamos las medidas de dispersión de la variable Recency\n", "\n", "print('El rango de la variable Recency es: ', df['Recency'].max() - df['Recency'].min())\n", "print('La varianza de la variable Recency es: ', df['Recency'].var())\n", "print('La desviación estándar de la variable Recency es: ', df['Recency'].std())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "El percentil 25 de la variable Recency es: 24.0\n", "El percentil 50 de la variable Recency es: 49.0\n", "El percentil 75 de la variable Recency es: 74.0\n" ] } ], "source": [ "## Incluso podriamos explorar los percentiles de la variable Recency\n", "\n", "print('El percentil 25 de la variable Recency es: ', df['Recency'].quantile(0.25))\n", "print('El percentil 50 de la variable Recency es: ', df['Recency'].quantile(0.50))\n", "print('El percentil 75 de la variable Recency es: ', df['Recency'].quantile(0.75))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sin embargo, antes de hacer el cálculo de estas medidas, podría considerar usar `describe` para obtener un resumen de las medidas de tendencia central y dispersión.\n", "\n", "```{admonition} Importante\n", "Los datos aquí cargados son bastante buenos, por eso no estamos haciendo una limpieza de datos. Sin embargo, en un caso real, es importante hacer una limpieza antes de hacer un análisis. Entre los pasos comunes para hacer este prtocesamiento previo, se encuentran:\n", "- la eliminación de datos faltantes, \n", "- la eliminación de datos duplicados, \n", "- la eliminación de datos atípicos, entre otros.\n", "```" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 2205.000000\n", "mean 49.009070\n", "std 28.932111\n", "min 0.000000\n", "25% 24.000000\n", "50% 49.000000\n", "75% 74.000000\n", "max 99.000000\n", "Name: Recency, dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Recency'].describe()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 2205.000000\n", "mean 49.009070\n", "std 28.932111\n", "min 0.000000\n", "1% 0.000000\n", "5% 4.000000\n", "10% 9.000000\n", "25% 24.000000\n", "50% 49.000000\n", "75% 74.000000\n", "90% 89.000000\n", "95% 94.000000\n", "99% 98.000000\n", "max 99.000000\n", "Name: Recency, dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Adicionar estadísticas descriptivas en describe\n", "\n", "df['Recency'].describe(percentiles=[.01, .05, .10, .25, .50, .75, .90, .95, .99])" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 0 }